[dbt] 作成したデータモデルの使い方を示すことができるExposuresを使ってみた
大阪オフィスの玉井です。
最近、見ていない間に、dbtにも色々な機能が増えております。
今回は、Exposuresという機能を使ってみたいと思います。
概要
公式ドキュメントの解説を(多少崩しながら)そのまま読むならば、「dbtのプロジェクトの下流での利用を定義する」といったところでしょうか。もう少し、自分なりの解釈を挟むと、dbtで生成したデータモデルの使いみちを記述できる(補足する)機能かと思いました。
使ってみるとわかりますが、dbt docs generate
で生成できるドキュメントに、そのデータモデルの「使いみち」を追記できる形となります。
というわけで、実際に使ってみたいと思います。
やってみた
環境
- dbt Cloud
- dbt v1.0
Exposuresはymlファイルに追記する
ここでいうymlファイルとは、sourceとかtestとかを書いているymlファイルのことです。modelsディレクトリ下に作成するymlファイルです(dbt_project.yml
ではない)。
結論から先に言うと、下記のように記述します。
exposures: - name: 顧客情報 type: dashboard maturity: medium url: https://dev.classmethod.jp/author/tama/ description: > このデータは、Tableauの顧客分析ダッシュボードに使われるテーブル群ですわ!!!!!!!!。 depends_on: - ref('dim_customers') - ref('stg_customers') - ref('stg_orders') - source('jaffle', 'raw_order') - source('jaffle', 'raw_customer') owner: name: 玉井励 email: tamai.rei@classmethod.jp
パラメータのうち、入力が必須なのは、以下の3点です。
- name
- Exposuresの名前
- type
- データモデルの使いみちの種類を指定します。値は決まっており、
dashboard
とかml
等があります(ドキュメント上でこれらのカテゴリ別に整理されるようです)。
- データモデルの使いみちの種類を指定します。値は決まっており、
- owner: email
- Exposuresを定めた人物のメールアドレスを入力します。このデータモデル群の詳細を聞く相手…って感じでしょうか。
重要なパラメータなのはdepends_on
です。Explosuresで示した使いみちの対象となるデータモデルを指定します(私が検証した限り、各順番はテキトーで大丈夫です。依存関係はdbt側が認識するようです)。
コマンドを叩いてExposuresを適用する
dbt docsにExposuresを反映するには、dbtコマンドを実行するのですが、例えば下記を実行すると、depends_on
で指定しているデータモデルに対してrunが実行され、かつexposuresがドキュメントに反映されます。runじゃなくてtestとかでもいけるようです。
dbt run -s +exposure:顧客情報
公式ドキュメントには特に言及されていないのですが、(例えば、Exposuresの内容を編集した後)普通にdbt docs generate
を実行するだけでも、dbt docsに内容が反映されました。
Exposuresを確認する
反映したら、dbt docsを見てみましょう。
まず、左側のメニューに「Exposures」が追加されており、その下に今回追加したものが反映されています(type
で指定したカテゴリ的なやつも、ここに反映されるようです)。
これをクリックすると、Exposuresの詳細を確認することができます。ymlファイルに記述した内容が反映されていますね。ちなみに、右上の「View this exposure」を押すと、url
パラメータに指定されているURLに遷移します。BIツール用のデータモデルであれば、そのBIツールのダッシュボードに飛ばす等が理想の設定でしょうか。
DAGも見ることが出来ます。depends_on
で指定したデータモデルの依存関係がわかります。最終的には、別色で表現されたExposuresに集約されるようになっていました。
おわりに
データカタログのちょっとした代替になるかな?という感じでした(タグとかもつけれそうなので)。dbtの活用が進めば進むほど「これはどういう理由で作られたデータモデルなんだろう…」となるので、ある程度dbtに慣れてきたら、ぜひ活用していきたい機能ですね。